package com.yuven.appframework.util.security;

import android.text.TextUtils;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES {
    // 加密
    public static String Encrypt16(String sSrc, String sKey){
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        if (null == sSrc ||"".equals(sSrc) ) {
            System.out.print("sSrc为空");
            return "";
        }
        // 判断Key是否为16位
        if (sKey.length() != 16) {
            System.out.print("Key长度不是16位");
            return null;
        }
        byte[] encrypted = null;
        byte[] raw;
        try {
            raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(null==encrypted) {
            return "";
        }
        return parseByte2HexStr(encrypted);
    }

    // 解密
    public static String Decrypt16(String sSrc, String sKey) throws Exception {
        try {
            // 判断Key是否正确
            if (sKey == null) {
                System.out.print("Key为空null");
                return null;
            }
            // 判断Key是否为16位
            if (sKey.length() != 16) {
                System.out.print("Key长度不是16位");
                return null;
            }
            byte[] raw = sKey.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] encrypted1 = parseHexStr2Byte(sSrc);
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original,"utf-8");
                return originalString;
            } catch (Exception e) {
                System.out.println(e.toString());
                return sSrc;
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return sSrc;
        }
    }

    /**将二进制转换成16进制
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    /**将16进制转换为二进制
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length()/2];
        for (int i = 0;i< hexStr.length()/2; i++) {
            int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
            int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }


    /**
     *  Base64加密
     *
     * @return
     */
    public static final String encodeBase64(String name) {
        if(name != null){
            try {
                name = new String(Base64.encode(name.getBytes()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return name;
    }

    /**
     *  Base64解密
     *
     * @return
     */
    public static final String decodeBase64(String name) {
        if(name != null){
            try {
                name = new String(Base64.decodeToBytes(name));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return name;
    }

    /**
     * 按加密规则验证是否16进制
     * E67C40B16C351A3AF0A2FA1EE709E20F
     * 1、长度必须是32位倍数
     * 2、必须同时包含A-F与0-9之间的组合
     * 3、不要对oracle sys_guid()函数生成的数据进行判断
     * @Title: verifyHex16
     * @Description: 按规则验证是否16进制加密
     * @param: @param str
     * @param: @return
     * @return: boolean
     * @throws
     */
    public static boolean isHex16(String str){

        if(TextUtils.isEmpty(str) || str.length()%32 !=0){
            return false;
        }
        String regex="^[A-F]+$";
        if(str.matches(regex)){
            return false;
        }
        regex="^[0-9]+$";
        if(str.matches(regex)){
            return false;
        }

        regex="^[A-F0-9]+$";
        if(str.matches(regex)){
            return true;
        }else{
            return false;
        }
    }

}
